package hyl.core.io;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import hyl.core.Amy;
import hyl.core.MyFun;
import hyl.core.net.MyHttp;

public class ZipUpload {
	static String temppath = null;
	static String uploadurl = null;
	Map<String, List<File>> 上传文件 = new HashMap<>();

	/**
	 * 
	 * @param 打包名
	 * @param 本地临时目录
	 * @param 提交URL
	 */
	public ZipUpload(String 本地临时目录, String 提交URL) {
		temppath = 本地临时目录;
		uploadurl = 提交URL;
	}

	private List<File> getPack(String 打包名) {
		if (上传文件.containsKey(打包名))
			return 上传文件.get(打包名);
		else {
			List<File> 打包文件 = new ArrayList<>();
			上传文件.put(打包名, 打包文件);
			return 打包文件;
		}
	}

	/**
	 * 
	 * @param filename 创建或覆盖临时文件
	 * @param text     文件内容
	 * @throws UnsupportedEncodingException
	 */
	public void inputFile(String 打包名, String filename, String text) throws UnsupportedEncodingException {
		List<File> list = getPack(打包名);
		String filepath = temppath + '\\' + 打包名 + "\\" + filename;
		File f = MyFile.openFile(filepath);
		MyFile.writeFile(f, text, Amy.charset);
		list.add(f);
	}

	private File zipFiles(String 打包名) throws FileNotFoundException {
		List<File> fs = 上传文件.get(打包名);
		if (fs == null || fs.isEmpty())
			return null;
		String filepath = temppath + '\\' + 打包名 + ".zip";
		File f = MyFile.openFile(filepath);
		FileOutputStream os;
		os = new FileOutputStream(f);
		MyFile.doZipFiles(fs, os);
		return f;
	}

	private void clearTempFiles() {
		System.gc();
		MyFile.deleteDir(temppath);
		上传文件.clear();
	}

	private String getParams(Map<String, String> 参数) {
		StringBuilder sb = new StringBuilder(uploadurl);
		for (Map.Entry<String, String> p : 参数.entrySet()) {
			String v = p.getValue();
			String k = p.getKey();
			if (!MyFun.isEmpty(v)) {
				if (sb.indexOf("?") > 0)
					sb.append("&").append(k).append("=").append(v);
				else
					sb.append("?").append(k).append("=").append(v);
			}
		}
		return sb.toString();
	}

	/**
	 * 把所有不同包的文件，合并到根目录后上传到服务端
	 * 
	 * @param 文件类型
	 * @param 其他参数
	 * @return 返回服务器处理结果
	 */
	public String submit(Map<String, String> 参数) {
		String url = getParams(参数);
		try {
			List<File> files = new ArrayList<>();
			for (List<File> en : 上传文件.values()) {
				files.addAll(en);
			}
			String result = MyHttp.upload(url, files);
			clearTempFiles();
			return result;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 分包压缩后上传
	 * 
	 * @param 请求参数
	 * @return
	 */
	public String zipSubmit(Map<String, String> 请求参数) {
		String url = getParams(请求参数);
		System.out.println(url);
		try {
			List<File> zips = new ArrayList<>();
			for (String en : 上传文件.keySet()) {
				File f = zipFiles(en);
				if (f == null)
					continue;
				zips.add(f);
			}
			String result = MyHttp.upload(url, zips);
			clearTempFiles();
			return result;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

}
